//Falta arreglar escenario graficar por niveles
//falta colisionador
#include "juego.h"



juego::juego(escenario* esc, listaTexturas* listaTex) {
	this->threadMov = NULL;
	this->escenarioJuego = esc;
	this->listaTex = listaTex;
	this->queue1 = new QueueClient();
	this->queue2 = new QueueClient();
	this->jugador1 = new jugador();
	this->jugador2 = new jugador();
}


//sirve para inicializar los handlers
void juego::initHandlers() {
	
	HandlerMovimiento* handler1 = new HandlerMovimiento(queue1); 
	HandlerMovimiento* handler2 = new HandlerMovimiento(queue2);
	handlersClienteServer[ACTUALIZACION_PAD_1]=handler1;
	handlersClienteServer[ACTUALIZACION_PAD_2]=handler2;
	handlerReady = new HandlerReadyClients(this);
	handlersClienteServer[LISTO_EL_POLLO]=handlerReady;
}

int juego::getPuntajeGlobal(){
	return this->puntajeGlobal;
}

void juego::run() {
	this->initHandlers();
	
	
	///CUIDADO CON ESTO!!!
	this->serverSocket = new ServerSocket(handlersClienteServer,5555,2);
	///CUIDADO CON ESTO


	logger::getInstancia()->log("Levantando el server");
	this->serverSocket->start();

	logger::getInstancia()->log("Esperando a los locos");
	while(!serverSocket->allConnected()){
		//aca me aseguro de tener los dos clientes conectados
		this->sleep(100);
	}
	logger::getInstancia()->log("Largando la sincro");
	//una vez que esta todo conectado, empiezo las etapas del juego

	//primero, sincronizo las texturas
	this->serverSocket->sincronizarTexturas(this->listaTex);
    
	int cant_levels;
	cant_levels = this->escenarioJuego->get_cant_levels();
	
	int nivelActual = 0;
	
	while (nivelActual<cant_levels && this->serverSocket->allConnected()) {
		logger::getInstancia()->log("Empieza escenario nuevo");
		
		//crear mensaje de escenario nuevo y enviarlo a los clientes.
		// Sincro de escenario
		ready=false;
		handlerReady->setClients(2);
		this->escenarioJuego->setCurrentLevel(nivelActual);
		listaFiguras* listaNivelActual = this->escenarioJuego->getListaFiguras(nivelActual);
		this->serverSocket->sincronizarNivel(listaNivelActual);
		
		while(!ready){
		//aca me aseguro de tener los dos clientes conectados
			this->sleep(100);
		}
		//los mensajes de los calculos, los manda el thread movimiento??
		this->serverSocket->sendStartMessage();
		this->sleep(50);
		this->threadMov = new threadMovimiento(this);
		wait(MUTEX);
			queue1->clear();
			queue2->clear();
		release(MUTEX);
		this->threadMov->run();
		
		//paso al proximo escenario
		nivelActual++;
		//parar threadMovimiento
	}

	this->serverSocket->sendEndMessage(this->getJugador1()->getPuntaje(),this->getJugador2()->getPuntaje());

//	this->serverSocket->closeAllConnections();
}

juego::~juego() {
	if (this->threadMov != NULL) {
		delete(this->threadMov);
	}
	delete(this->escenarioJuego);
	//primero hacer mierda las texturas
	delete(this->listaTex);
	delete(queue1);
	delete(queue2);
	delete(this->serverSocket);
}



void juego::jugando(escenario* esc){

}

void juego::setReady(bool value){
	ready = value;
}